iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Security

醫療數據的資安挑戰與創新解決方案系列 第 10

醫療數據 API:Token 驗證 + 資料庫整合

  • 分享至 

  • xImage
  •  

本日的學習目標是理解如何建構一個簡單的醫療 API,能夠接收病人資料,並結合 Token 與角色權限控管 (RBAC) 驗證使用者存取權限,同時將資料安全地儲存到資料庫。這讓你能將前幾天學到的加密、存取控制以及 IoT 裝置數據整合,打造更完整的醫療資訊系統。

一、理論重點

  • API 概念:API 是應用程式介面,允許不同程式或裝置透過 HTTP 請求互相交換資料。
  • Token 驗證:使用 JWT 或類似 Token,確認使用者身分,避免未授權存取。
  • 資料安全:API 與資料庫結合時,要考慮加密傳輸、加密存儲與存取控制,防止資料外洩。
  • 整合前後端與裝置:將 IoT 裝置數據、前端請求與後端資料庫整合,形成完整醫療資訊系統。

二、案例分享

2021 年,新加坡某醫院推行遠距血壓監測計畫,病人使用智慧血壓計測量數據後自動上傳至醫院雲端系統,醫師透過 API 查詢自己病人的血壓紀錄,系統使用 API Token 與 RBAC 控制存取,並透過 HTTPS 加密傳輸,確保數據安全與隱私,實際減少了不必要的門診次數且未發生數據外洩。

三、簡單程式範例

serevr.py

from fastapi import FastAPI, Request, HTTPException
import mysql.connector

app = FastAPI()

# 假設簡單 Token
TOKENS = {
    "patient123": "patient",
    "doctor123": "doctor"
}

# MySQL 連線設定
DB_CONFIG = {
    "host": "localhost",
    "user": "root",
    "password": "我的密碼",
    "database": "health_db"
}

# 初始化資料庫
def init_db():
    # 先連線 MySQL 建資料庫(如果不存在)
    conn = mysql.connector.connect(
        host=DB_CONFIG["host"],
        user=DB_CONFIG["user"],
        password=DB_CONFIG["password"]
    )
    cur = conn.cursor()
    cur.execute(f"CREATE DATABASE IF NOT EXISTS {DB_CONFIG['database']}")
    conn.commit()
    conn.close()

    # 建資料表
    conn = mysql.connector.connect(**DB_CONFIG)
    cur = conn.cursor()
    cur.execute("""
    CREATE TABLE IF NOT EXISTS blood_pressure (
        id INT AUTO_INCREMENT PRIMARY KEY,
        systolic INT,
        diastolic INT,
        pulse INT
    )
    """)
    conn.commit()
    conn.close()

init_db()

# 病人上傳血壓資料 API
@app.post("/upload")
async def upload(request: Request):
    token = request.headers.get("Authorization")
    if TOKENS.get(token) != "patient":
        raise HTTPException(status_code=401, detail="Unauthorized")

    data = await request.json()
    conn = mysql.connector.connect(**DB_CONFIG)
    cur = conn.cursor()
    cur.execute(
        "INSERT INTO blood_pressure (systolic, diastolic, pulse) VALUES (%s, %s, %s)",
        (data["systolic"], data["diastolic"], data["pulse"])
    )
    conn.commit()
    conn.close()
    return {"status": "success", "data": data}

# 醫師查詢最近五筆血壓紀錄 API
@app.get("/records")
def records(request: Request):
    token = request.headers.get("Authorization")
    if TOKENS.get(token) != "doctor":
        raise HTTPException(status_code=401, detail="Unauthorized")

    conn = mysql.connector.connect(**DB_CONFIG)
    cur = conn.cursor()
    cur.execute("SELECT * FROM blood_pressure ORDER BY id DESC LIMIT 5")
    rows = cur.fetchall()
    conn.close()
    return {"records": rows}

上面的程式打完後就可以開始執行步驟,在VsCode中執行

uvicorn server:app --reload

接著就可以用Python模擬上傳病人資料

import requests

url = "http://127.0.0.1:8000/upload"
data = {"systolic": 120, "diastolic": 80, "pulse": 70}
headers = {"Authorization": "patient123"}

res = requests.post(url, json=data, headers=headers)
print(res.json())

用醫生的token查詢資料

import requests

url = "http://127.0.0.1:8000/records"
headers = {"Authorization": "doctor123"}
res = requests.get(url, headers=headers)
print(res.json())

執行的結果如下
https://ithelp.ithome.com.tw/upload/images/20250917/20169331bmaFvBX5ya.png


上一篇
IoT 裝置數據上傳 + 資料庫儲存
系列文
醫療數據的資安挑戰與創新解決方案10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言